package com.hw01.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hw01.controller.vo.ResultVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * @ClassName LoginInterceptor
 * @Description 自定义拦截器
 * @Author Kx
 * @Date 2025/5/14 19:57
 * @Version 1.0
 */
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * @author: kx
     * @date: 2025/5/14 19:59
     * @param request : 请求对象
     * @param response : 响应对象
     * @param handler : 处理器
     * @return boolean
     * @description: 过滤器方法之后控制器方法之前执行
    */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 放行OPTIONS请求(放行预检请求)
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            return true;
        }

        // 获取令牌
        String token = request.getHeader("auth");
        // 判断令牌是否为空
        if (!token.isEmpty()) {
            return true;
        }
        // 创建响应对象
        ResultVO resultVO = new ResultVO();
        // 设置错误码
        resultVO.setCode(HttpStatus.UNAUTHORIZED.value());
        // 设置错误信息
        resultVO.setMessage("尚未登录");
        // 设置响应数据格式(告诉客户端响应内容是 JSON 格式)
        response.setContentType("application/json");
        // 把响应对象序列化成 JSON 字符串
        String resultJSON = new ObjectMapper().writeValueAsString(resultVO);
        // 把数据响应给客户端
        response.getWriter().write(resultJSON);
        return false;
    }

    /**
     * @author: kx
     * @date: 2025/5/14 20:00
     * @param request : 请求对象
     * @param response : 响应对象
     * @param handler : 处理器
     * @param modelAndView : 视图对象
     * @description: 在控制器方法之后渲染视图之前执行
    */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * @author: kx
     * @date: 2025/5/14 20:01
     * @param request : 请求对象
     * @param response :  响应对象
     * @param handler : 处理器
     * @param ex : 异常对象
     * @description: 整个请求处理完毕之后执行
    */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
